/**
 * 通用js方法封装处理
 * Copyright (c) 2019 ycst
 */
import { ElMessage,ElLoading,ElNotification } from 'element-plus';

// 日期格式化
export function parseTime(time, pattern) {
  if (arguments.length === 0 || !time) {
    return null;
  }
  const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}';
  let date;
  if (typeof time === 'object') {
    date = time;
  } else {
    if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
      time = parseInt(time);
    } else if (typeof time === 'string') {
      time = time
        .replace(new RegExp(/-/gm), '/')
        .replace('T', ' ')
        .replace(new RegExp(/\.[\d]{3}/gm), '');
    }
    if (typeof time === 'number' && time.toString().length === 10) {
      time = time * 1000;
    }
    date = new Date(time);
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  };
  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key];
    // Note: getDay() returns 0 on Sunday
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value];
    }
    if (result.length > 0 && value < 10) {
      value = '0' + value;
    }
    return value || 0;
  });
  return time_str;
}

// 表单重置
export function resetForm(refName) {
  if (this.$refs[refName]) {
    this.$refs[refName].resetFields();
  }
}

// 添加日期范围
export function addDateRange(params, dateRange, propName) {
  let search = params;
  search.params =
    typeof search.params === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
  dateRange = Array.isArray(dateRange) ? dateRange : [];
  if (typeof propName === 'undefined') {
    search.params['beginTime'] = dateRange[0];
    search.params['endTime'] = dateRange[1];
  } else {
    search.params['begin' + propName] = dateRange[0];
    search.params['end' + propName] = dateRange[1];
  }
  return search;
}

// 回显数据字典
export function selectDictLabel(datas, value) {
  if (value === undefined) {
    return '';
  }
  var actions = [];
  Object.keys(datas).some((key) => {
    if (datas[key].value == '' + value) {
      actions.push(datas[key].label);
      return true;
    }
  });
  if (actions.length === 0) {
    actions.push(value);
  }
  return actions.join('');
}

// 回显数据字典（字符串数组）
export function selectDictLabels(datas, value, separator) {
  if (value === undefined || value.length === 0) {
    return '';
  }
  if (Array.isArray(value)) {
    value = value.join(',');
  }
  var actions = [];
  var currentSeparator = undefined === separator ? ',' : separator;
  var temp = value.split(currentSeparator);
  Object.keys(value.split(currentSeparator)).some((val) => {
    var match = false;
    Object.keys(datas).some((key) => {
      if (datas[key].value == '' + temp[val]) {
        actions.push(datas[key].label + currentSeparator);
        match = true;
      }
    });
    if (!match) {
      actions.push(temp[val] + currentSeparator);
    }
  });
  return actions.join('').substring(0, actions.join('').length - 1);
}

// 字符串格式化(%s )
export function sprintf(str) {
  var args = arguments,
    flag = true,
    i = 1;
  str = str.replace(/%s/g, function () {
    var arg = args[i++];
    if (typeof arg === 'undefined') {
      flag = false;
      return '';
    }
    return arg;
  });
  return flag ? str : '';
}

// 转换字符串，undefined,null等转化为""
export function parseStrEmpty(str) {
  if (!str || str == 'undefined' || str == 'null') {
    return '';
  }
  return str;
}

// 数据合并
export function mergeRecursive(source, target) {
  for (var p in target) {
    try {
      if (target[p].constructor == Object) {
        source[p] = mergeRecursive(source[p], target[p]);
      } else {
        source[p] = target[p];
      }
    } catch (e) {
      source[p] = target[p];
    }
  }
  return source;
}
/**
 * 全屏打开加载框*/

export const openLoading = (text) => {
  return ElLoading.service({
    fullscreen: true,
    lock: true,
    text,
    background: 'rgba(29, 84, 189, 0.7)'
  });
};

/**
 * 参数处理
 * @param {*} params  参数
 */
export function tansParams(params) {
  let result = '';
  for (const propName of Object.keys(params)) {
    const value = params[propName];
    var part = encodeURIComponent(propName) + '=';
    if (value !== null && value !== '' && typeof value !== 'undefined') {
      if (typeof value === 'object') {
        for (const key of Object.keys(value)) {
          if (value[key] !== null && value[key] !== '' && typeof value[key] !== 'undefined') {
            let params = propName + '[' + key + ']';
            var subPart = encodeURIComponent(params) + '=';
            result += subPart + encodeURIComponent(value[key]) + '&';
          }
        }
      } else {
        result += part + encodeURIComponent(value) + '&';
      }
    }
  }
  return result;
}

// 返回项目路径
export function getNormalPath(p) {
  if (p.length === 0 || !p || p == 'undefined') {
    return p;
  }
  let res = p.replace('//', '/');
  if (res[res.length - 1] === '/') {
    return res.slice(0, res.length - 1);
  }
  return res;
}

// 验证是否为blob格式
export function blobValidate(data) {
  return data.type !== 'application/json';
}

/**
 * 判断是否为空
 */
export const isNull = (obj) => {
  return obj === null || obj === undefined || obj.toString() === '';
};

/**
 * @description 验证是否是数组
 * @param {Array} list
 */
export const isList = (list) => {
  return Array.isArray(list) && list.length > 0;
};

/**
 * 正则校验座机、手机号
 * @param rule
 * @param value
 * @param callback
 */
export const telRules = (rule, value, callback) => {
  if (value && !/^((0\d{2,3}-\d{7,8})|(1[3456789]\d{9}))$/.test(value)) {
    callback('请输入正确格式的座机、手机号');
  } else {
    callback();
  }
};

/**
 * 复制文本
 * @param text 文本内容
 * @param msg 是否显示反馈
 * @returns {Promise<void>}
 */
export const copyText = async (text, msg = true) => {
  if (navigator.clipboard && window.isSecureContext) {
    await navigator.clipboard.writeText(text);
    if (msg) {
      ElNotification({
        title: 'Success',
        message: '已复制',
        type: 'success'
      });
    }
  } else {
    let input = document.createElement('input');
    input.style.position = 'fixed';
    input.style.top = '-10000px';
    input.style.zIndex = '-999';
    document.body.appendChild(input);
    input.value = text;
    input.focus();
    input.select();
    try {
      let result = document.execCommand('copy');
      document.body.removeChild(input);
      if (!result || result === 'unsuccessful') {
        if (msg) ElMessage.error('复制失败');
      } else {
        if (msg) ElMessage.success('已复制');
      }
    } catch (e) {
      document.body.removeChild(input);
      ElMessage.warning('当前浏览器不支持复制功能，请检查更新或更换其他浏览器操作');
    }
  }
};



export const validatorIsNumber = (rule, value, callback) => {
  if (isNaN(value)) {
    callback(new Error('请输入数字'));
  } else {
    callback();
  }
};


// 构建树形结构
export function buildTree(data) {
  const nodeMap = new Map();
  const roots = [];
  // 初始化所有节点并存储到Map中
  data.forEach(node => {
    nodeMap.set(node.name, { ...node, children: [] });
  });
  // 构建父子关系
  data.forEach(node => {
    const currentNode = nodeMap.get(node.name);
    if (node.parentName) {
      const parentNode = nodeMap.get(node.parentName);
      if (parentNode) {
        parentNode.children.push(currentNode);
      }
    } else {
      roots.push(currentNode);
    }
  });
  return roots;
}
